﻿using Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Ordens.LoteOrdem;
using Sinacor.Infra.UI.Common;
using System.Collections.Generic;
using Sinacor.Infra.Common;
using System;

namespace Sinacor.UI.Bovespa.Ordens.Communication.Translator
{         
    /// <summary>
    /// Classe tradutora entre objetos Model e Response
    /// </summary>
    public class TranslateLoteOrdem 
        // BaseTranslator<LoteOrdemRequest,  Model.LoteOrdem,  List<LoteOrdemRequest>, ModelCollection<Model.LoteOrdem> >
    {
        public Model.LoteOrdem Translate(LoteOrdemRequest from)
        {
            if (from == null) return null;

            Sinacor.UI.Bovespa.Ordens.Model.LoteOrdem to = new Sinacor.UI.Bovespa.Ordens.Model.LoteOrdem();
            
            to.DataOrdem = (from.DataOrdem == null ? System.DateTime.MinValue : (System.DateTime)from.DataOrdem);
            to.DataPregao = (from.DataPregao == null ? System.DateTime.MinValue : (System.DateTime)from.DataPregao);
            //to.NomeLote = (from.NomeLote == null ? string.Empty : from.NomeLote);
            to.NumeroConjunto = (from.NumeroConjunto == null ? -1 : (int) from.NumeroConjunto);
            to.NumeroSequenciaOrdem = (from.NumeroSequenciaOrdem == null ? -1 : (int) from.NumeroSequenciaOrdem);
            to.NumeroSubSequenciaOrdem = (from.NumeroSubSequenciaOrdem == null ? -1 : (int) from.NumeroSubSequenciaOrdem);
            //to.PrecoMedio = (from.PrecoMedio == null ? 0 : (decimal) fromPrecoMedio);            

            return to;
        }

        public ModelCollection<Model.LoteOrdem> Translate(List<LoteOrdemResponse> loteOrdemResponse)
        {
            ModelCollection<Model.LoteOrdem> resultado = new ModelCollection<Model.LoteOrdem>();

            foreach(LoteOrdemResponse response in loteOrdemResponse)
            {
                resultado.Add( this.Translate(response) );
            }

            return resultado;
        }

        private Sinacor.UI.Bovespa.Ordens.Model.LoteOrdem Translate(LoteOrdemResponse from)
        {
            Model.LoteOrdem model = new Sinacor.UI.Bovespa.Ordens.Model.LoteOrdem();

            model.DataOrdem = (from.DataOrdem == null ? System.DateTime.MinValue : (System.DateTime) from.DataOrdem);
            model.DataPregao = (from.DataPregao == null ? System.DateTime.MinValue : (System.DateTime) from.DataPregao);
            model.NomeLote = from.NomeLote;
            model.NumeroConjunto = (from.NumeroConjunto == null ? -1 : (int) from.NumeroConjunto);
            model.NumeroSequenciaOrdem = (from.NumeroSequenciaOrdem == null ? -1 : (int) from.NumeroSequenciaOrdem);
            model.NumeroSubSequenciaOrdem = (from.NumeroSubSequenciaOrdem == null ? -1 : (int) from.NumeroSubSequenciaOrdem);
            model.PrecoMedio = (from.PrecoMedio == null ? -1 : (decimal) from.PrecoMedio);
            model.QuantidadeCasada = from.QuantidadeCasada;            

            return model;
        }

        public LoteOrdemRequest Translate(Model.LoteOrdem pModel)
        {
            LoteOrdemRequest req = new LoteOrdemRequest();

            req.DataOrdem = pModel.DataOrdem;
            req.DataPregao = pModel.DataPregao;
            req.NumeroConjunto = pModel.NumeroConjunto;
            req.NumeroSequenciaOrdem = pModel.NumeroSequenciaOrdem;
            req.NumeroSubSequenciaOrdem = pModel.NumeroSubSequenciaOrdem;
            req.NumeroConjuntoDestino = pModel.NumeroConjuntoDestino;            

            return req;
        }

        public List<LoteOrdemRequest> Translate(ModelCollection<Sinacor.UI.Bovespa.Ordens.Model.LoteOrdem> pListLoteOrdem)
        {
            List<LoteOrdemRequest> resultado = new List<LoteOrdemRequest>();

            foreach (Model.LoteOrdem response in pListLoteOrdem)
            {
                resultado.Add(this.Translate(response));
            }

            return resultado;
        }


        public Model.LoteOrdem ToLoteOrdem(Model.Ordem ordem)
        {
            Model.LoteOrdem loteOrdem = new Model.LoteOrdem();            

            if (ordem.DataOrdem != null)
                loteOrdem.DataOrdem = (DateTime)ordem.DataOrdem;

            if (ordem.DataPregao != null)
                loteOrdem.DataPregao = (DateTime) ordem.DataPregao;
            
            if (ordem.NumeroConjunto != null)
                loteOrdem.NumeroConjunto = (int) ordem.NumeroConjunto;

            if (ordem.NumeroOrdem != null)
                loteOrdem.NumeroSequenciaOrdem = (int) ordem.NumeroOrdem;

            if (ordem.NumeroOrdemSequencia != null)
                loteOrdem.NumeroSubSequenciaOrdem = (int) ordem.NumeroOrdemSequencia;

            if (ordem.PrecoMedio != null)
                loteOrdem.PrecoMedio = (decimal)ordem.PrecoMedio;

            loteOrdem.QuantidadeCasada = ordem.QuantidadeCasada;

            return loteOrdem;
        }


        public ModelCollection<Model.LoteOrdem> ToLoteOrdemModelCollection(
            ModelCollection<Model.Ordem> ordemModelCollection,
            int? novoNumeroConjunto
        )
        {
            ModelCollection<Model.LoteOrdem> loteOrdemModelCollection = new ModelCollection<Model.LoteOrdem>();

            foreach (Model.Ordem ordem in ordemModelCollection)
            {
                Model.LoteOrdem loteOrdem = this.ToLoteOrdem(ordem);
                loteOrdem.NumeroConjunto = ordem.NumeroConjunto == null ? 0 : (int)ordem.NumeroConjunto;
                loteOrdem.NumeroConjuntoDestino = (int) novoNumeroConjunto;
                loteOrdemModelCollection.Add( loteOrdem );
            }

            return loteOrdemModelCollection;
        }
    }     
}

